package com.itbaizhan.openhis.controller.system;

import com.itbaizhan.openhis.dto.RoleDto;
import com.itbaizhan.openhis.service.RoleService;
import com.itbaizhan.openhis.utils.ShiroSecurityUtils;
import com.itbaizhan.openhis.vo.AjaxResult;
import com.itbaizhan.openhis.vo.DataGridView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotEmpty;
import java.util.List;

/**
 * @Description:角色控制器
 */

@RestController
@RequestMapping("system/role")
public class RoleController {

    @Autowired
    private RoleService roleService;


    /**
     * 保存角色和用户之间的关系
     * @param userId
     * @param roleIds
     * @return
     */
    @PostMapping("saveRoleUser/{userId}/{roleIds}")
    public AjaxResult saveRoleUser(@PathVariable Long userId,@PathVariable Long[] roleIds){
        /**
         * 因为我们用的路径参数，前端可能传过来的roleIds是一个空的，但是为空的话无法匹配上面的路径
         * 所以如果为空，我们让前端传一个-1过来，如果是-1说明当前角色一个权限也没有选择
         */
        if (roleIds.length == 1 && roleIds[0].equals(-1L)){
            roleIds = new Long[]{};
        }
        roleService.saveRoleUser(userId,roleIds);
        return AjaxResult.success("更新成功");
    }

    /**
     * 查询所有角色
     * @return
     */
    @GetMapping("selectAllRole")
    public AjaxResult selectAllRole(){
        return AjaxResult.success(roleService.selectAllRole());
    }

    /**
     * 根据用户ID查询角色
     * @param userId
     * @return
     */
    @GetMapping("getRoleIdsByUserId/{userId}")
    public AjaxResult getRoleIdsByUserId(@PathVariable Long userId){
        List<Long> roleIds = roleService.getRoleIdsByUserId(userId);
        return AjaxResult.success(roleIds);
    }


    /**
     * 分页查询角色
     * @param roleDto
     * @return
     */
    @GetMapping("listRoleForPage")
    public AjaxResult listRoleForPage(RoleDto roleDto){
        DataGridView dataGridView = roleService.listRoleForPage(roleDto);
        return AjaxResult.success("查询成功",dataGridView.getData(),dataGridView.getTotal());
    }

    /**
     * 添加角色
     * @param roleDto
     * @return
     */
    @PostMapping("addRole")
    public AjaxResult addRole(@Validated RoleDto roleDto){
        roleDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());
        return AjaxResult.toAjax(roleService.addRole(roleDto));
    }

    /**
     * 修改角色
     * @param roleDto
     * @return
     */
    @PutMapping("updateRole")
    public AjaxResult updateRole(@Validated RoleDto roleDto){
        roleDto.setSimpleUser(ShiroSecurityUtils.getCurrentSimpleUser());
        return AjaxResult.toAjax(roleService.updateRole(roleDto));
    }

    /**
     * 根据ID查询一个角色信息
     * @param roleId
     * @return
     */
    @GetMapping("getRoleById/{roleId}")
    public AjaxResult getRoleById(@PathVariable @Validated
                                  @NotEmpty(message = "角色ID不能为空") Long roleId){
        return AjaxResult.success("查询成功",roleService.getRoleById(roleId));
    }

    /**
     * 删除角色
     * @param roleIds
     * @return
     */
    @DeleteMapping("deleteRoleByIds/{roleIds}")
    public AjaxResult deleteRoleByIds(@PathVariable @NotEmpty(message = "要删除的ID不能为空")
                                      @Validated Long[] roleIds){
        return AjaxResult.toAjax(roleService.deleteRoleByIds(roleIds));
    }

    /**
     * 保存角色和权限菜单之间的关系
     * @param roleId
     * @param menuIds
     * @return
     */
    @PostMapping("saveRoleMenu/{roleId}/{menuIds}")
    public AjaxResult saveRoleMenu(@PathVariable Long roleId,@PathVariable Long[] menuIds){
        /**
         * 因为我们用的路径参数，前端可能传过来的menuIds是一个空的，但是为空的话无法匹配上面的路径
         * 所以如果为空，我们让前端传一个-1过来，如果是-1说明当前角色一个权限也没有选择
         */
        if (menuIds.length == 1 && menuIds[0].equals(-1L)){
            menuIds = new Long[]{};
        }
        this.roleService.saveRoleMenu(roleId,menuIds);
        return AjaxResult.success("更新成功");
    }
}
